--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / visualiser-wasm / internal / hashpos / hashpos.go
Displaying Raw • Download
visualiser-wasm/internal/hashpos/hashpos.go 3f7ef731b5effd9aa3a81eceea66fd6c2b56498c (3f7ef731) Text, 1.54 KB
T8b949e// SPDX-License-Identifier: 0BSD
T8b949e// Package hashpos derives stable layout angles from node ids.
Tff7b72package Te6edf3hashpos
Tff7b72import Ta5d6ff"math"
T8b949e// fnv1a32 hashes s with FNV-1a without heap allocation.
Tff7b72func Te6edf3fnv1a32Tb4b4b4(Te6edf3s Tffa657stringTb4b4b4) Tffa657uint32 Tb4b4b4{
Tff7b72const Tb4b4b4(
Te6edf3offset Tb4b4b4= T79c0ff2166136261
Te6edf3prime Tb4b4b4= T79c0ff16777619
Tb4b4b4)
Te6edf3h Tff7b72:= Tffa657uint32Tb4b4b4(Te6edf3offsetTb4b4b4)
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< Tffa657lenTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3h Tb4b4b4^Tb4b4b4= Tffa657uint32Tb4b4b4(Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Te6edf3h Tff7b72*= Te6edf3prime
Tb4b4b4}
Tff7b72return Te6edf3h
Tb4b4b4}
T8b949e// fnv1a32Salt hashes id + NUL + salt with FNV-1a without heap allocation.
Tff7b72func Te6edf3fnv1a32SaltTb4b4b4(Te6edf3idTb4b4b4, Te6edf3salt Tffa657stringTb4b4b4) Tffa657uint32 Tb4b4b4{
Tff7b72const Tb4b4b4(
Te6edf3offset Tb4b4b4= T79c0ff2166136261
Te6edf3prime Tb4b4b4= T79c0ff16777619
Tb4b4b4)
Te6edf3h Tff7b72:= Tffa657uint32Tb4b4b4(Te6edf3offsetTb4b4b4)
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< Tffa657lenTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3h Tb4b4b4^Tb4b4b4= Tffa657uint32Tb4b4b4(Te6edf3idTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Te6edf3h Tff7b72*= Te6edf3prime
Tb4b4b4}
Te6edf3h Tb4b4b4^Tb4b4b4= T79c0ff0
Te6edf3h Tff7b72*= Te6edf3prime
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< Tffa657lenTb4b4b4(Te6edf3saltTb4b4b4)Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3h Tb4b4b4^Tb4b4b4= Tffa657uint32Tb4b4b4(Te6edf3saltTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Te6edf3h Tff7b72*= Te6edf3prime
Tb4b4b4}
Tff7b72return Te6edf3h
Tb4b4b4}
T8b949e// Angle01 returns a deterministic angle in [0, 2*Pi) for id.
Tff7b72func Te6edf3Angle01Tb4b4b4(Te6edf3id Tffa657stringTb4b4b4) Tffa657float64 Tb4b4b4{
Te6edf3u Tff7b72:= Te6edf3fnv1a32Tb4b4b4(Te6edf3idTb4b4b4)
Tff7b72return Tb4b4b4(Tffa657float64Tb4b4b4(Te6edf3uTff7b72%T79c0ff10000Tb4b4b4) Tff7b72/ T79c0ff10000.0Tb4b4b4) Tff7b72* T79c0ff2 Tff7b72* Te6edf3mathTb4b4b4.Te6edf3Pi
Tb4b4b4}
T8b949e// Dist01 returns a deterministic unit fraction in [0, 1) for id and salt.
Tff7b72func Te6edf3Dist01Tb4b4b4(Te6edf3idTb4b4b4, Te6edf3salt Tffa657stringTb4b4b4) Tffa657float64 Tb4b4b4{
Te6edf3u Tff7b72:= Te6edf3fnv1a32SaltTb4b4b4(Te6edf3idTb4b4b4, Te6edf3saltTb4b4b4)
Tff7b72return Tffa657float64Tb4b4b4(Te6edf3uTff7b72%T79c0ff10000Tb4b4b4) Tff7b72/ T79c0ff10000.0
Tb4b4b4}
T8b949e// XY places a point at radius base+span*Dist01 around the origin.
Tff7b72func Te6edf3XYTb4b4b4(Te6edf3id Tffa657stringTb4b4b4, Te6edf3baseTb4b4b4, Te6edf3span Tffa657float64Tb4b4b4) Tb4b4b4(Te6edf3xTb4b4b4, Te6edf3y Tffa657float64Tb4b4b4) Tb4b4b4{
Te6edf3a Tff7b72:= Te6edf3Angle01Tb4b4b4(Te6edf3idTb4b4b4)
Te6edf3d Tff7b72:= Te6edf3base Tff7b72+ Te6edf3Dist01Tb4b4b4(Te6edf3idTb4b4b4, Ta5d6ff"r"Tb4b4b4)Tff7b72*Te6edf3span
Tff7b72return Te6edf3mathTb4b4b4.Te6edf3CosTb4b4b4(Te6edf3aTb4b4b4) Tff7b72* Te6edf3dTb4b4b4, Te6edf3mathTb4b4b4.Te6edf3SinTb4b4b4(Te6edf3aTb4b4b4) Tff7b72* Te6edf3d
Tb4b4b4}
T8b949e// Around places a point near parent using a deterministic offset.
Tff7b72func Te6edf3AroundTb4b4b4(Te6edf3id Tffa657stringTb4b4b4, Te6edf3pxTb4b4b4, Te6edf3pyTb4b4b4, Te6edf3baseTb4b4b4, Te6edf3span Tffa657float64Tb4b4b4) Tb4b4b4(Te6edf3xTb4b4b4, Te6edf3y Tffa657float64Tb4b4b4) Tb4b4b4{
Te6edf3a Tff7b72:= Te6edf3Angle01Tb4b4b4(Te6edf3idTb4b4b4)
Te6edf3d Tff7b72:= Te6edf3base Tff7b72+ Te6edf3Dist01Tb4b4b4(Te6edf3idTb4b4b4, Ta5d6ff"r"Tb4b4b4)Tff7b72*Te6edf3span
Tff7b72return Te6edf3px Tff7b72+ Te6edf3mathTb4b4b4.Te6edf3CosTb4b4b4(Te6edf3aTb4b4b4)Tff7b72*Te6edf3dTb4b4b4, Te6edf3py Tff7b72+ Te6edf3mathTb4b4b4.Te6edf3SinTb4b4b4(Te6edf3aTb4b4b4)Tff7b72*Te6edf3d
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────